# 内核入口汇编代码，内核启动时执行的第一段代码
# 在RISCV中，hart表示CPU核心

# 定义.text代码段
.section .text
.global _entry                # 将_start声明为全局符号（可直接在其他文件中引用）
_entry:
    # 支持多核,hartid从0开始
    # 为每个hart设置独立的栈空间（每个hart都要执行这段代码）
    # start.c中定义了一个 4096 * NCPU大小的字符数组stack0作为内核栈
    # sp最终指向该hart栈空间的起始位置（大地址为栈底）
    la sp, stack0             # load addr(stack0) -> sp，即栈指针sp指向stack0
    li a0, 1024*4             # load 4096（立即数i）-> a0，即每个hart的栈大小
    csrr a1, mhartid          # read CSR(hartid) -> a1
    addi a1, a1, 1            # a1 = a1 + 1
    mul a0, a0, a1            # a0 = a0 * a1 <=> a0 = 4096 * (hartid + 1)
    add sp, sp, a0            # sp = sp + a0 <=> sp = stack0 + 4096 * (hartid + 1)
    # 调用C语言编写的内核核心函数
    call start
# 死循环，防止程序执行完毕后继续执行未知代码
spin:
    j spin